我們以一個Student範例, 計算成績Score時有個CalculateScore()
函數
public class Student
{
public Score CalculateScore()
{
Console.WriteLine("Calculate score");
TransferCourseDetail(CourseTypes.Major);
// next calculation flow
}
public void TransferCourseDetail(CourseTypes types)
{
//....
}
}
public class Student
{
public Score CalculateScore()
{
Console.WriteLine("Calculate score");
TransferCourseDetail(CourseTypes.Major);
// next calculation flow
}
public virtual void TransferCourseDetail(CourseTypes types)
{
CourseDetail.TransferDetail(types);
}
}
public class CourseDetail
{
public static void TransferDetail(CourseTypes types)
{
//....
}
}
從上面看到, 我們為TransferCourseDetail
函數新增virtual
修飾詞, 並將實作的邏輯,
移動到新的CourseDetail
類別的TransferDetail
函數.
因此, virtual void TransferCourseDetail
成為一個Seam.
如果今天要維護一個沒有測試的程式碼, 或者要重構, 此時為了要確保程式邏輯能被驗證,
讓seam可以做替換功能, 驗證我們想先關注的部分.
回到上面的例子, 如果CalculateScore
只是想先確認回傳的Score
物件是符合"初步"預期,TransferDetail
的實作可以先忽略, 那麼寫單元測試時, TransferDetail
可以被override為空實作或者簡單的assertion.
另外CourseDetail
也抽出獨立的TransferDetail
函數, 也能單獨測試它的功能.
最終兩邊class的TransferDetail
測試都完成, 後續再考慮使用哪些重構做改善.